package com.booksystem.campuslibrarymanagementsystem.controller.mainactivity;

import com.booksystem.campuslibrarymanagementsystem.commen.request.mainactivityrequest.Fogot.Resetpassword;
import com.booksystem.campuslibrarymanagementsystem.commen.request.mainactivityrequest.Fogot.Sendemail;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.entity.AccountTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.CodeUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.EmailSender;
import com.booksystem.campuslibrarymanagementsystem.utils.HashUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.SaltUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/MainActivity")
@Api(tags = "忘记密码")
public class ForgotPswController {
    String code = null;
    String account = null;

    @Autowired
    private AccountTableService accountTableService;

    /**
     * 发送验证码接口。
     * @RequestBody Sendemail（account学号，name名字）
     * 1.判断学号，名字信息是否填写完整
     * 2.不完整：返回失败信息-请填写完整信息。完整：判断输入的学号格式是否全数字，长度为9.
     * 3.不是：返回失败信息-请注意！学号长度为9。是：将输入的学号在account表中查询是否存在。
     * 4.不存在：返回失败信息-没有找到此账户。存在：判断该学号在表中的状态（通过，未通过，已停用）
     * 5.未通过：返回失败信息-该账户未通过审核，请等待管理员审核。已停用：返回失败信息-该账户已停用。通过：对比输入的名字和数据库中名字是否一致。
     * 6.不一致：返回失败信息-所提供的名字和表中学生名字不同。一致：获取随机验证码，并发送到留存的账户邮箱中
     * @return Result.success();or return Result.fail();
     */
    @PostMapping("/SendEmail")
    @ApiOperation(value = "发送验证码", notes = "输入邮箱进行密码重铸")
    public Result SendEmail(@RequestBody Sendemail sendemail) {
        if (sendemail.getAccount().isEmpty() || sendemail.getName().isEmpty()) {
            return Result.fail("请填写完整信息");
        } else {
            if (sendemail.getAccount().matches("^\\d{9}$")) {
                AccountTable accountTable = accountTableService.queryByAccount(sendemail.getAccount());
                if (accountTable == null) {
                    return Result.fail("没有找到此账户");
                } else {
                    if (accountTable.getState().equals("已通过")) {
                        if (accountTable.getName().equals(sendemail.getName())) {
                            code = CodeUtil.codeGet();
                            account = sendemail.getAccount();
                            EmailSender.sendEmails(accountTable.getEmail(), "【校园图书管理系统】验证码：" + code +"。您正在重置密码操作，请勿将验证码告诉他人。");
                            return Result.success(code,1);
                        } else {
                            return Result.fail("所提供的名字和表中学生名字不同");
                        }
                    } else if (accountTable.getState().equals("未通过")){
                        return Result.fail("该账户未通过审核，请等待管理员审核");
                    }else if (accountTable.getState().equals("已停用")){
                        return Result.fail("该账户已停用");
                    }else {
                        return Result.fail("该账户状态异常");
                    }
                }
            } else {
                return Result.fail("请注意！学号长度为 9");
            }
        }
    }

    /**
     * 重置密码接口。
     * @RequestBody Resetpassword（code验证码，passwordone密码一，passwordtwo密码二）
     * 1.判断验证码，学号是否为null即是否发送过验证码
     * 2.null：返回失败信息-code并未获取。不为null：判断输入的验证码，密码一，密码二信息是否完整。
     * 3.不完整：返回失败信息-请填写完整信息。完整：判断密码一和密码二是否一致。
     * 4.不一致：返回失败信息-两次密码不一致。一致：判断输入的密码格式是否为英文和数字的组合，并且长度为6
     * 5.不是：返回失败信息-密码长度为6，同时包含至少一个数字和一个英文字符。是：重新获取并储存salt，将密码一和salt合并后通过哈希加密成为加密密码generatedHash，通过account将，generatedHash，salt储存到account数据表中。返回成功信息-密码重置成功
     * 6.不一致：返回失败信息-所提供的名字和表中学生名字不同。一致：获取随机验证码，并发送到留存的账户邮箱中
     * @return Result.success();or return Result.fail();
     */
    @PostMapping("/ResetPassword")
    @ApiOperation(value = "重置密码", notes = "输入验证码进行密码重铸")
    public Result ResetPassword(@RequestBody Resetpassword resetpassword) {
        if (code==null || account==null) {
            return Result.fail("code并未获取");
        } else {
            if (resetpassword.getCode().isEmpty() || resetpassword.getPasswordone().isEmpty() || resetpassword.getPasswordtwo().isEmpty()) {
                return Result.fail("请填写完整信息");
            } else {
                if (resetpassword.getCode().equals(code)) {
                    if (resetpassword.getPasswordone().equals(resetpassword.getPasswordtwo())) {
                        if (resetpassword.getPasswordone().matches("^(?=.*\\d)(?=.*[a-zA-Z])[a-zA-Z\\d]{6}$")) {
                            String salt = SaltUtil.saltGet();
                            String psw = resetpassword.getPasswordone() + salt;
                            String generatedHash = HashUtil.HashGet(psw);
                            boolean a = accountTableService.upDataPswAndSalt(account, generatedHash, salt);
                            if (a) {
                                return Result.success("密码重置成功", 1);
                            } else {
                                return Result.fail("密码重置失败，请联系管理员");
                            }
                        } else {
                            return Result.fail("密码长度为6，同时包含至少一个数字和一个英文字符");
                        }
                    } else {
                        return Result.fail("两次密码不一致");
                    }
                } else {
                    return Result.fail("验证码错误");
                }

            }
        }
    }


}
